/**************************************************************************************************
 * THE LOOKING GLASS VISUALIZATION TOOLSET
 *-------------------------------------------------------------------------------------------------
 * Author: 
 *	Alessandro Febretti		Electronic Visualization Laboratory, University of Illinois at Chicago
 * Contact & Web:
 *  febret@gmail.com		http://febretpository.hopto.org
 *-------------------------------------------------------------------------------------------------
 * Looking Glass has been built as part of the ENDURANCE Project (http://www.evl.uic.edu/endurance/).
 * ENDURANCE is supported by the NASA ASTEP program under Grant NNX07AM88G and by the NSF USAP.
 *-------------------------------------------------------------------------------------------------
 * Copyright (c) 2010-2011, Electronic Visualization Laboratory, University of Illinois at Chicago
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without modification, are permitted 
 * provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of conditions 
 * and the following disclaimer. Redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the following disclaimer in the documentation and/or other 
 * materials provided with the distribution. 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE  GOODS OR SERVICES; LOSS OF 
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *************************************************************************************************/ 
#ifndef LINETOOL_H
#define LINETOOL_H

///////////////////////////////////////////////////////////////////////////////////////////////////
#include "LookingGlassSystem.h"
#include "DockedTool.h"
#include "ui_LineToolDock.h"

///////////////////////////////////////////////////////////////////////////////////////////////////
class DataSet;
class Ui_MainWindow;
class VisualizationManager;
class vtkActor;

class pqColorChooserButton;

class vtkLineRepresentation;
class vtkLineWidget2;

///////////////////////////////////////////////////////////////////////////////////////////////////
struct LineInfo
{
	double Min[3];
	double Max[3];
	bool Visible;
	QColor Color;
};

///////////////////////////////////////////////////////////////////////////////////////////////////
class LineTool: public DockedTool
{
    Q_OBJECT
public:
	static const int MaxLines = 4;
public:
    /////////////////////////////////////////////////////// Ctor / Dtor.
    LineTool(VisualizationManager* msg);
    ~LineTool();

	void Initialize();
	void OnLineWidgetChanged();
	LineInfo& GetLine(int index);

protected slots:
	void OnLineCurrentIndexChanged(int);
	void OnShowLineToggled(bool);
	void OnLineColorChanged(const QColor&);
	void OnLineBoundsChanged();
	void OnStartPointClicked();
	void OnEndPointClicked();

private:
	void SetupUI();

private:
	// UI.
	Ui_LineToolDock* myUI;
	VisualizationManager* myVizMng;

	LineInfo myLines[MaxLines];
	pqColorChooserButton* myLineColorButton;
	bool myIndexChanging;

	vtkLineRepresentation* myLineRep;
	vtkLineWidget2* myLineWidget;
};

///////////////////////////////////////////////////////////////////////////////////////////////////
inline LineInfo& LineTool::GetLine(int index) 
{ return myLines[index]; }

#endif 
